/*!
 * \file IBaseDataMgr.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 基础数据管理接口定义
 * \details 定义了基础数据管理模块的核心接口，提供品种、合约、交易时段等基础信息的管理和查询功能
 */
#pragma once
#include <string>
#include <stdint.h>

#include "WTSMarcos.h"
#include "FasterDefs.h"

NS_WTP_BEGIN
typedef CodeSet ContractSet;

class WTSContractInfo;
class WTSArray;
class WTSSessionInfo;
class WTSCommodityInfo;

typedef faster_hashset<uint32_t> HolidaySet;

/**
 * @struct _TradingDayTpl
 * @brief 交易日模板结构
 * @details 用于存储交易日信息和节假日集合的模板结构。
 *          包含当前交易日期和节假日集合。
 */
typedef struct _TradingDayTpl
{
	uint32_t	_cur_tdate;		///< 当前交易日期，格式为yyyyMMdd
	HolidaySet	_holidays;		///< 节假日集合，存储所有节假日日期

	_TradingDayTpl() :_cur_tdate(0){}
} TradingDayTpl;

/**
 * @class IBaseDataMgr
 * @brief 基础数据管理接口
 * @details 基础数据管理模块的核心接口，提供品种、合约、交易时段等基础信息的管理和查询功能。
 *          主要功能包括：
 *          - 品种信息管理和查询
 *          - 合约信息管理和查询
 *          - 交易时段信息管理和查询
 *          - 节假日判断
 *          - 交易日期计算
 *          - 边界时间获取
 *          
 *          该接口是基础数据管理模块的核心，为整个交易系统提供基础数据支撑。
 */
class IBaseDataMgr
{
public:
	/**
	 * @brief 根据交易所产品ID获取品种信息
	 * @details 根据交易所和产品的组合ID获取品种信息。
	 * 
	 * @param exchgpid 交易所产品ID，格式为"交易所.产品ID"
	 * @return WTSCommodityInfo* 品种信息指针，失败返回nullptr
	 */
	virtual WTSCommodityInfo*	getCommodity(const char* exchgpid)						= 0;
	
	/**
	 * @brief 根据交易所和产品ID获取品种信息
	 * @details 根据分离的交易所代码和产品ID获取品种信息。
	 * 
	 * @param exchg 交易所代码
	 * @param pid 产品ID
	 * @return WTSCommodityInfo* 品种信息指针，失败返回nullptr
	 */
	virtual WTSCommodityInfo*	getCommodity(const char* exchg, const char* pid)		= 0;

	/**
	 * @brief 根据合约代码获取合约信息
	 * @details 根据合约代码和可选的交易所代码获取合约信息。
	 * 
	 * @param code 合约代码
	 * @param exchg 交易所代码，默认为空字符串表示所有交易所
	 * @return WTSContractInfo* 合约信息指针，失败返回nullptr
	 */
	virtual WTSContractInfo*	getContract(const char* code, const char* exchg = "")	= 0;
	
	/**
	 * @brief 获取合约列表
	 * @details 根据可选的交易所代码获取合约列表。
	 * 
	 * @param exchg 交易所代码，默认为空字符串表示所有交易所
	 * @return WTSArray* 合约信息数组，失败返回nullptr
	 */
	virtual WTSArray*			getContracts(const char* exchg = "")					= 0; 

	/**
	 * @brief 根据会话ID获取交易时段信息
	 * @details 根据会话ID获取对应的交易时段信息。
	 * 
	 * @param sid 会话ID
	 * @return WTSSessionInfo* 交易时段信息指针，失败返回nullptr
	 */
	virtual WTSSessionInfo*		getSession(const char* sid)						= 0;
	
	/**
	 * @brief 根据合约代码获取交易时段信息
	 * @details 根据合约代码和可选的交易所代码获取对应的交易时段信息。
	 * 
	 * @param code 合约代码
	 * @param exchg 交易所代码，默认为空字符串表示所有交易所
	 * @return WTSSessionInfo* 交易时段信息指针，失败返回nullptr
	 */
	virtual WTSSessionInfo*		getSessionByCode(const char* code, const char* exchg = "") = 0;
	
	/**
	 * @brief 获取所有交易时段信息
	 * @details 获取系统中配置的所有交易时段信息。
	 * 
	 * @return WTSArray* 交易时段信息数组，失败返回nullptr
	 */
	virtual WTSArray*			getAllSessions() = 0;

	/**
	 * @brief 判断是否为节假日
	 * @details 根据产品ID和日期判断是否为节假日。
	 * 
	 * @param pid 产品ID
	 * @param uDate 日期，格式为yyyyMMdd
	 * @param isTpl 是否使用模板，默认为false
	 * @return bool true表示是节假日，false表示不是节假日
	 */
	virtual bool				isHoliday(const char* pid, uint32_t uDate, bool isTpl = false) = 0;

	/**
	 * @brief 计算交易日期
	 * @details 根据标准产品ID、日期和时间计算对应的交易日期。
	 *          用于处理跨日交易和夜盘交易的日期归属问题。
	 * 
	 * @param stdPID 标准产品ID
	 * @param uDate 日期，格式为yyyyMMdd
	 * @param uTime 时间，格式为HHmmss
	 * @param isSession 是否考虑交易时段，默认为false
	 * @return uint32_t 计算后的交易日期，格式为yyyyMMdd
	 */
	virtual uint32_t			calcTradingDate(const char* stdPID, uint32_t uDate, uint32_t uTime, bool isSession = false) = 0;
	
	/**
	 * @brief 获取边界时间
	 * @details 根据标准产品ID和交易日期获取交易时段的边界时间。
	 *          可以获取开盘时间或收盘时间。
	 * 
	 * @param stdPID 标准产品ID
	 * @param tDate 交易日期，格式为yyyyMMdd
	 * @param isSession 是否考虑交易时段，默认为false
	 * @param isStart 是否获取开始时间，true表示开盘时间，false表示收盘时间
	 * @return uint64_t 边界时间，Unix时间戳格式
	 */
	virtual uint64_t			getBoundaryTime(const char* stdPID, uint32_t tDate, bool isSession = false, bool isStart = true) = 0;
};
NS_WTP_END